package day_04_01_ThreadSafeList;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * @Description 线程安全的 list 操作
 * @Author shihan
 * @Date 2020/11/1 9:22
 * @Version 1.0
 */
public class ThreadSafeList {

    public static void main(String[] args) {
        // ArrayList 的 add 和 get 都没有加 synchronize 的限制
        ArrayList<String> list = new ArrayList<>();

        //【保证线程安全的方式：】
        //【方式一：Vector】（不推荐使用）
        // Vector 的 add 和 get 都加上了 synchronize 的限制 -- 严格保证同一时间，只能有一个线程操作 Vector，并且 读和写 都加上了锁
        Vector<String> list1 = new Vector<>();

        //【方式二：Collections.synchronizedList(new ArrayList<>()) 获取一个安全的 List】（可以但不推荐）
        List<String> list2 = Collections.synchronizedList(new ArrayList<>());

        //【方式三：JUC -- CopyOnWriteArrayList<>() 】（推荐使用）
        List<String> list3 = new CopyOnWriteArrayList<>();

        //测试一：不报异常，但是内容有问题
        /*for (int i = 1; i <= 3 ; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(list);
            },i+"").start();
        }*/

        //测试二：报 ConcurrentModificationException （可以发现，并发异常错误，是在 sys.out 时 iterator 遍历出现的并发修改问题）
        /*for (int i = 1; i <= 30 ; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(list);
            },i+"").start();
        }*/

        //测试三：线程安全后，不会出现 ConcurrentModificationException 异常！
        for (int i = 1; i <= 30 ; i++) {
            new Thread(() -> {
                list3.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(list3);
            },i+"").start();
        }

    }
}
